/*******************************************************************************
* Copyright (c) 2000, 2016 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
* Mikael Barbero (Eclipse Foundation) - Bug 254570
*******************************************************************************/
package org.eclipse.jface.tests.viewers;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.jface.viewers.IElementComparer;
import org.eclipse.jface.viewers.StructuredSelection;
import junit.framework.TestCase;
public class StructuredSelectionTest extends TestCase {
static final IElementComparer JAVA_LANG_OBJECT_COMPARER = new IElementComparer() {
@Override
public int hashCode(Object element) {
return element.hashCode() + 71; // arbitrary prime number different from the
// one used in IDENTITY_COMPARER
}
@Override
public boolean equals(Object a, Object b) {
return a.equals(b);
}
};
static final IElementComparer IDENTITY_COMPARER = new IElementComparer() {
@Override
public int hashCode(Object element) {
return element.hashCode() + 97; // arbitrary prime number different from the
// one used in JAVA_LANG_OBJECT_COMPARER
}
@Override
public boolean equals(Object a, Object b) {
return a == b;
}
};
public StructuredSelectionTest(String name) {
super(name);
}
public static void main(String args[]) {
junit.textui.TestRunner.run(StructuredSelectionTest.class);
}
public void testEquals() {
String element = "A selection";
StructuredSelection sel1 = new StructuredSelection(element);
StructuredSelection sel2 = new StructuredSelection(element);
EqualsHashCodeContractTestHelper.testExpectedEqualsObjects(sel1, sel2);
}
public void testEquals2() {
String element1 = "A selection";
String element2 = "A selection";
String element3 = "Other";
StructuredSelection sel1 = new StructuredSelection(element1);
StructuredSelection sel2 = new StructuredSelection(element2);
StructuredSelection sel3 = new StructuredSelection(element3);
EqualsHashCodeContractTestHelper.testExpectedEqualsObjects(sel1, sel2);
EqualsHashCodeContractTestHelper.testExpectedNotEqualsObjects(sel1, sel3);
}
public void testEquals3() { // two empty selections
StructuredSelection empty1 = new StructuredSelection();
StructuredSelection empty2 = new StructuredSelection();
EqualsHashCodeContractTestHelper.testExpectedEqualsObjects(empty1, empty2);
}
public void testEquals4() { // empty selection with non-empty selection
StructuredSelection sel = new StructuredSelection("A selection");
StructuredSelection empty = new StructuredSelection();
EqualsHashCodeContractTestHelper.testExpectedNotEqualsObjects(sel, empty);
}
public void testEquals5() { // equality is order-dependent
List l1 = new ArrayList();
l1.add("element 1");
l1.add("element 2");
List l2 = new ArrayList();
l2.add("element 2");
l2.add("element 1");
StructuredSelection sel1 = new StructuredSelection(l1);
StructuredSelection sel2 = new StructuredSelection(l2);
EqualsHashCodeContractTestHelper.testExpectedNotEqualsObjects(sel1, sel2);
}
public void testEquals6() { // different selections
List l1 = new ArrayList();
l1.add("element 1");
l1.add("element 2");
List l2 = new ArrayList();
l2.add("element 2");
l2.add("element 3");
l2.add("element 1");
StructuredSelection sel1 = new StructuredSelection(l1);
StructuredSelection sel2 = new StructuredSelection(l2);
EqualsHashCodeContractTestHelper.testExpectedNotEqualsObjects(sel1, sel2);
}
/**
* Empty selections via different constructors.
* Regression test for bug 40245.
*/
public void testEquals7() {
StructuredSelection empty1 = new StructuredSelection();
StructuredSelection empty2 = new StructuredSelection(new Object[0]);
EqualsHashCodeContractTestHelper.testExpectedEqualsObjects(empty1, empty2);
}
public void testEqualsWithComparer1() {
doTestEqualsWithComparer1(JAVA_LANG_OBJECT_COMPARER);
doTestEqualsWithComparer1(IDENTITY_COMPARER);
}
private void doTestEqualsWithComparer1(IElementComparer comparer) {
StructuredSelection sel1 = new StructuredSelection(Arrays.asList("A selection"), comparer);
StructuredSelection sel2 = new StructuredSelection(Arrays.asList("A selection"), comparer);
EqualsHashCodeContractTestHelper.testExpectedEqualsObjects(sel1, sel2);
}
public void testEqualsWithComparer2() {
doTestEqualsWithComparer2(JAVA_LANG_OBJECT_COMPARER);
doTestEqualsWithComparer2(IDENTITY_COMPARER);
}
private void doTestEqualsWithComparer2(IElementComparer comparer) {
StructuredSelection sel1 = new StructuredSelection(Arrays.asList("element 1", "element 2"), comparer);
StructuredSelection sel2 = new StructuredSelection(Arrays.asList("element 1", "element 2"), comparer);
EqualsHashCodeContractTestHelper.testExpectedEqualsObjects(sel1, sel2);
}
public void testEqualsWithComparer3() {
doTestEqualsWithComparer3(JAVA_LANG_OBJECT_COMPARER);
doTestEqualsWithComparer3(IDENTITY_COMPARER);
}
private void doTestEqualsWithComparer3(IElementComparer comparer) {
StructuredSelection sel1 = new StructuredSelection(Arrays.asList("element 1", "element 2"), comparer);
StructuredSelection sel2 = new StructuredSelection(Arrays.asList("element 2", "element 1"), comparer);
EqualsHashCodeContractTestHelper.testExpectedNotEqualsObjects(sel1, sel2);
}
public void testEqualsWithComparer4() {
doTestEqualsWithComparer4(JAVA_LANG_OBJECT_COMPARER);
doTestEqualsWithComparer4(IDENTITY_COMPARER);
}
private void doTestEqualsWithComparer4(IElementComparer comparer) {
StructuredSelection sel1 = new StructuredSelection(new ArrayList<>(), comparer);
StructuredSelection sel2 = new StructuredSelection(Arrays.asList("element 1"), comparer);
EqualsHashCodeContractTestHelper.testExpectedNotEqualsObjects(sel1, sel2);
}
public void testEqualsWithComparer5() {
doTestEqualsWithComparer5(JAVA_LANG_OBJECT_COMPARER);
doTestEqualsWithComparer5(IDENTITY_COMPARER);
}
private void doTestEqualsWithComparer5(IElementComparer comparer) {
StructuredSelection sel1 = new StructuredSelection(new ArrayList<>(), comparer);
StructuredSelection sel2 = new StructuredSelection(new ArrayList<>(), comparer);
EqualsHashCodeContractTestHelper.testExpectedEqualsObjects(sel1, sel2);
}
static class EqualsHashCodeContractTestHelper {
private static final String HASHCODE_CONSISTENCY_MSG = "Whenever it is invoked on the same object more than once during an execution of a Java application, the hashCode method must consistently return the same integer, provided no information used in equals comparisons on the object is modified.";
private static final String EQUALS_IMPLIES_SAME_HASHCODE_MSG = "If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result.";
private static final String REFLEXIVITY_MSG = "For any non-null reference value x, x.equals(x) should return true.";
private static final String SYMMETRICITY_MSG = "For any non-null reference values x and y, x.equals(y) should return true if and only if y.equals(x) returns true.";
private static final String EQUALS_CONSITENCY_MSG = "For any non-null reference values x and y, multiple invocations of x.equals(y) consistently return true or consistently return false, provided no information used in equals comparisons on the objects is modified.";
private static final String NOT_EQUALS_NULL_MSG = "For any non-null reference value x, x.equals(null) should return false.";
private static final int CONSISTENCY_THRESHOLD = 10;
public static void testExpectedEqualsObjects(Object o1, Object o2) {
// reflexive
assertTrue(REFLEXIVITY_MSG, o1.equals(o1));
assertTrue(REFLEXIVITY_MSG, o2.equals(o2));
// symmetric
assertTrue(SYMMETRICITY_MSG, o1.equals(o2));
assertTrue(SYMMETRICITY_MSG, o2.equals(o1));
// consistent
for (int i = 0; i < CONSISTENCY_THRESHOLD; i++) {
assertTrue(EQUALS_CONSITENCY_MSG, o1.equals(o2));
assertTrue(EQUALS_CONSITENCY_MSG, o2.equals(o1));
}
assertFalse(NOT_EQUALS_NULL_MSG, o1.equals(null));
assertFalse(NOT_EQUALS_NULL_MSG, o2.equals(null));
// a.equals(b) => a.hashCode() == b.hashCode()
assertTrue(EQUALS_IMPLIES_SAME_HASHCODE_MSG, o1.hashCode() == o2.hashCode());
for (int i = 0; i < CONSISTENCY_THRESHOLD; i++) {
assertTrue(HASHCODE_CONSISTENCY_MSG, o1.hashCode() == o1.hashCode());
assertTrue(HASHCODE_CONSISTENCY_MSG, o2.hashCode() == o2.hashCode());
}
}
public static void testExpectedNotEqualsObjects(Object o1, Object o2) {
// symmetric
assertFalse(o1.equals(o2));
assertFalse(o2.equals(o1));
// Not required: assertFalse(o1.hashCode() == o2.hashCode())
// It is not required that if two objects are unequal according to
// the
// java.lang.Object.equals(java.lang.Object) method, then calling
// the hashCode
// method on each of the two objects must produce distinct integer
// results.
// However, the programmer should be aware that producing distinct
// integer
// results for unequal objects may improve the performance of hash
// tables.
}
}
}